package com.controller;

import com.utils.RedisUtil;
import com.utils.myUtil;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.NumberUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

/**
 * 问题的实现类
 * 2. 某电商业务场景2：
 * 运营推广部门某次策划上线秒杀或者优惠活动，经测试人员估算压力测试，大约在一个小时内进来100万+用户访问，
 * 系统吞吐量固定的情况下，为保障Java服务端正常运行不崩溃，需要对正常访问用户进行限流处理，大约每秒响应1000个请求。
 * 请问限流的系统如何设计，给出具体的实现？（服务端框架采用spring boot+mybatis+redis）
 * @author zzuli_huahua
 * @version 1.0
 * @date 2022/7/10 17:58
 */
@RestController
@Slf4j
public class objectController {

    @Resource
    private RedisUtil redisUtil;

    // 1、请求下单操作
    /**
     *根据商品id减去库存
     * http://localhost:8080/tryOrder/get
     * @return
     */
    @GetMapping("tryOrder/get")
    public String tryOrder(){
    // 2、尝试redis数据库减一操作
        long decr = redisUtil.decr("9002", 1);// 参数1：商品id 参数2：减去库存量 返回为减库存之后的值
        // 3、失败，则返回下单失败/秒杀失败，
        if(decr < 0){
            synchronized (this){
                log.info("第"+com.utils.myUtil.num++ +"次请求下单操作失败.............");
                log.info("redis库存量：=====================》" +decr);
            }
            return "Try order failed";
        }

        // 3、成功，则返回处理订单业务，记录购买商品的用户，支付成功后先入库，再删除缓存！（切记，redis不支持回滚）
        synchronized (this){
            log.info("第"+com.utils.myUtil.num++ +"次请求下单操作成功.............");
            log.info("redis库存量：=====================》" +decr);
        }
        String orderNumber = "999999999999";// 虚拟一个订单号（可包含用户信息等），实际还可以加   xxx：zzz     xxx代表用户id，zzz代表订单号等信息
        // 把成功下单的用户存入redis的list集合里面
        redisUtil.lSet("9002",orderNumber);// 9002是商品id，直接替换即可
        return "Try order succeed";
    }

}
